/**
 * @addtogroup indefine_list.h
 * indefine_list.h
 * @{
 */
/**
 * @file         ofc_indefine_list.h
 * @brief        不定长度的列表
 * @note    		 列表使用后注意内存的释放.
 * @author       Akee
 * @date         2019-11-4
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2019-11-4   <td>1.0                   <td>Akee            <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */
#ifndef _OFC_INDEFINE_LIST_H_
#define _OFC_INDEFINE_LIST_H_

#include "ofc_object.h"
#include "ofc_list.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 不定长度列表的不定长项
 */
typedef struct TOfIndefineListItemTag TOfIndefineListItem;
struct TOfIndefineListItemTag
{
    DWord id;  ///< id
    DWord len;  ///< 长度
    DWord value;  ///< 数据
};

/**
 * 不定长度的列表
 */
typedef struct TOfIndefineListTag TOfIndefineList;
struct TOfIndefineListTag
{
    TOfList parent_;                  ///< 基类

PROTECTED
    TOfVirtualMethod Destroy_;        ///< 析构事件
    
PRIVATE
    
};

/**
 * 构造函数
 * @param self: 对象指针
 * @return 无返回值 
 * @note 若采用此方法创建对象,需采用[OfDestroyObject](@ref OfDestroyObject)函数销毁对象
 */
void TOfIndefineListCreate(TOfIndefineList *self);

/**
 * 创建一个IndefineList
 * @return 返回创建的对象,创建失败返回NULL
 * @note 
 *    - 创建一个新列表之前,若没有执行[OfSetMallocProc](@ref OfSetMallocProc),则列表会创建失败,无法分配空间.详细请参见[OfSetMallocProc](@ref OfSetMallocProc)
 *    - 若采用此方法创建对象,需采用[OfFreeObject](@ref OfFreeObject)函数释放内存.详细请参见[OfFreeObject](@ref OfFreeObject)
 */
TOfIndefineList *OfCreateIndefineList(void);

/**
 * 增加一项数据
 * @param self: 对象指针
 * @param id: id值
 * @param value: 数据内容
 * @param len: 数据长度
 * @return 增加成功返回True,失败返回False
 */
Bool TOfIndefineListAddItem(TOfIndefineList *self, DWord id, const char *value, DWord len);

/**
 * 拷贝一项数据
 * @param self: 对象指针
 * @param item: 拷贝的对象
 * @return  拷贝成功返回True,拷贝失败返回False
 */
Bool TOfIndefineListCopyItem(TOfIndefineList *self, TOfIndefineListItem *item);

/**
 * 获取某一项索引的数据内容
 * @param self: 对象指针
 * @param index: 索引号
 * @return 返回索引所在的内容.
 */
TOfIndefineListItem *TOfIndefineListParams(TOfIndefineList *self, Int32 index);

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // _OFC_INDEFINE_LIST_H_

/**
 * @}
 */
